package controller

import (
	"context"
	"mldong/api/base"
	roleApi "mldong/api/role"
	"mldong/internal/modules/sys/logic"
	"mldong/internal/modules/sys/service"
	"mldong/utility"

	"github.com/gogf/gf/v2/frame/g"
)

func init() {
	// 注册控制器时自动注入依赖
	utility.RegisterController(&RoleController{
		// roleService: utility.MustResolve(service.RoleServiceType).(service.IRoleService),
		// 控制层使用强依赖logic的方式，保证逻辑层的init方法比controller的方法先执行
		roleService: utility.MustResolve(service.RoleServiceType).(*logic.RoleLogic),
	})
}

type RoleController struct {
	roleService service.IRoleService
}

// 保存角色
func (ctrl *RoleController) Save(ctx context.Context, req *roleApi.SaveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.roleService.Save(ctx, req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("保存角色失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 修改角色
func (ctrl *RoleController) Update(ctx context.Context, req *roleApi.UpdateReq) (res *base.CommonResult, err error) {
	success, err := ctrl.roleService.Update(ctx, req)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("修改角色失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 删除角色
func (ctrl *RoleController) Remove(ctx context.Context, req *roleApi.RemoveReq) (res *base.CommonResult, err error) {
	success, err := ctrl.roleService.Remove(ctx, req.Ids)
	if err != nil {
		return
	}
	if success {
		jsonData := base.Ok()
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	} else {
		jsonData := base.FailWithDefaultCode("删除角色失败")
		g.RequestFromCtx(ctx).Response.WriteJson(jsonData)
	}
	return
}

// 获取角色详情
func (ctrl *RoleController) Detail(ctx context.Context, req *roleApi.DetailReq) (res *roleApi.DetailRes, err error) {
	// 设置 JSON 数据
	jsonData, err := ctrl.roleService.Detail(ctx, req.ID)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}

// 分页查询角色列表
func (ctrl *RoleController) Page(ctx context.Context, req *roleApi.PageReq) (res *roleApi.PageRes, err error) {
	// 传递以m_开头的查询参数
	req.QueryParamMap = utility.GetQueryParamMap(ctx)
	jsonData, err := ctrl.roleService.Page(ctx, req)
	if err != nil {
		return
	}
	g.RequestFromCtx(ctx).Response.WriteJson(base.Data(jsonData))
	return
}
